HTTPSendRequestEx

Otázka od: Lebeda David

22. 4. 2004 13:33

Ahoj,

zkousim vytvorit jednu HTTP seanci pomoci WinInet v asynchronnim rezimu, ale
moc
se mi nedari.

Podminky:

1) Bezpodminecne pouziti WinInet
2) Moznost zobrazovat prubeh komunikace do listboxu
3) Jde o jeden pozadavek: metodou POST chci odeslat serveru pozadavek, ktery
bude
mit v tele nejaka data (cca 3000 B binarnich dat), na to precist odpoved, ktera
bude
obsahovat tez nejaky balik dat. Data jsou v TMemoryStreamu.

Mam zatim zhruba toto:

 FhInet := InternetOpen(PChar('AAAA'), INTERNET_OPEN_TYPE_DIRECT, nil, nil,
INTERNET_FLAG_ASYNC);

if FhInet = nil then
  raise Exception.Create('InternetOpen Failed');

InternetSetStatusCallback(FhInet, @InternetStatusCallbackFunc);

FhConnection := InternetConnect(FhInet, PChar(URL), RemotePort, '', '',
        INTERNET_SERVICE_HTTP, 0, 1);

if FhConnection = nil then
 raise Exception.Create('InternetConnect Failed');

FhRequest := HTTPOpenRequest(FhConnection, PChar('POST'), nil, nil,
                 nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 1);

  Buff.dwStructSize := sizeof(Buff);
  Buff.Next := nil;
  Buff.lpcszHeader := nil;
  Buff.dwHeadersLength := 0;
  Buff.dwHeadersTotal := 0;
  Buff.lpvBuffer := StreamKOdeslani.Memory;
  Buff.dwBufferLength := StreamKOdeslani.Size;
  Buff.dwBufferTotal := StreamKOdeslani.Size;
  Buff.dwOffsetLow := 0;
  Buff.dwOffsetHigh := 0;

  if not HTTPSendRequestEx(FhRequest, @Buff, nil, 0, lparam(Self)) then
  begin
   if GetLastError <> ERROR_IO_PENDING then
    raise Exception.Create('HTTPSendRequestEx Failed');
  end;

Tento kod by mel spustit asynchronne odeslani pozadavku. Prozatim neresim
prijem
odpovedi - ten bude v callback funkci.

InternetStatusCallbackFunc je callback funkce, ktera je prozatim prazdna.

No a ted problem. Posledni parametr ve funkcich InternetConnect a dalsich ma
byt
nejaka promenna urcujici kontext. Kdyz tam dam hodnotu nula, nevznikne nikde
zadna
chyba, ale callback funkce se nikdy nevyvola. Kdyz tam dam cokoli jineho,
program do
callback funkce vleze (predane parametry jsou ale nesmyslne, a po jejim
skonceni
vznikne access violation v kernel32.dll.

Nemate nekdo nahodou nejaky funkcni priklad na asynchronni komunikaci pres
WinInet
- nebo aspon nevite, co delam spatne?

Diky

David Lebeda